Linux 命令- sed

        sed 命令是利用 script 来处理文本文件。

        sed 可依照 script 的指令来处理、编辑文本文件。

        sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

        sed 可以实现 grep 的大部分功能,而且还可以查找替换。

        sed 跟 grep 一样,不识别 + 、| 、{}、 ()等符号,需要借助脱义符号 、 或者使用选项 -r

1. 命令语法

1
sed [-hnV] [-e<script>] [-f<script文件>] [文本文件]

2. 命令参数

  • -e <script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f 或–file= 以选项中指定的script文件来处理输入的文本文件。
  • -h 或–help 显示帮助。
  • -n 或–quiet或–silent 仅显示script处理后的结果。
  • -V 或–version 显示版本信息。

3. 命令动作

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

4.使用实例

实例1:在 testfile 文件的第四行后添加一行,并将结果输出到标准输出

        命令

1
sed -e 4a \newLine testfile

        输出

1
2
3
4
5
6
7
8
9
10
11
$ cat testfile
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
$ sed -e 4a\newline testfile
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newline

实例2:将 /etc/passwd 的内容列出并且列印行号,同时将第2-5行删除

        命令

1
nl /etc/passwd | sed '2,5d'

        输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# nl /etc/passwd|sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 dbus:x:81:81:System message bus:/:/sbin/nologin
17 polkitd:x:998:996:User for polkitd:/:/sbin/nologin
18 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21 chrony:x:997:995::/var/lib/chrony:/sbin/nologin

        说明

        以行为单位的删除,sed 的动作为 ‘2,5d’,那个 d 就是删除。因为 2-5 行给删除了,所以显示的数据就没有 2-5 行。另外,注意一下,原本应该是要下达 -e 才对,没有 -e 也可以。同时也要注意的是,sed 后面接的动作务必以 ‘’单引号括住。

        只要删除第2行

1
nl /etc/passwd | sed '2d'

        要删除第3到最后一行

1
nl /etc/passwd |sed '3,$d'

        在第2行后,第3行上加上 ‘drink tea’ 字样

1
nl /etc/passwd | sed '2a drink tea'

        如果要加再第2行前

1
nl /etc/passwd | sed '2i drink tea'

        如果要在第2行后面加入两行

1
2
nl /etc/passwd | sed '2a drink tea \
> drink beer'

        每一行之间都必须要以反斜杠(\)来进行新行的添加

实例3:将第2-5行内容取代成为‘2-5 number’

        命令

1
nl /etc/passwd | sed '2,5c 2-5 number'

        输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost ~]# nl /etc/passwd | sed '2,5c 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 dbus:x:81:81:System message bus:/:/sbin/nologin
17 polkitd:x:998:996:User for polkitd:/:/sbin/nologin
18 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21 chrony:x:997:995::/var/lib/chrony:/sbin/nologin

        说明

        以行为单位的替换与显示,通过这个方法就能够将数据整行取代了。

实例4:仅列出 /etc/passwd 文件内的5-7 行

        命令

1
nl /etc/passwd |sed -n '5,7p'

        输出

1
2
3
4
[root@localhost ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

        说明
        如果 root 找到,处理输出所有行,还回输出匹配行。
        使用 -n 的时候将只打印包含模版的行

1
2
3
[root@localhost ~]# nl /etc/passwd | sed -n '/root/p'
1 root:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/root:/sbin/nologin

实例5:删除 /etc/paawd 所有包含 root 的行,其他行输出

        命令

1
nl /etc/passwd | sed '/root/d'

        输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# nl /etc/passwd | sed '/root/d'
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 dbus:x:81:81:System message bus:/:/sbin/nologin
17 polkitd:x:998:996:User for polkitd:/:/sbin/nologin
18 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21 chrony:x:997:995::/var/lib/chrony:/sbin/nologin

        说明

        数据的搜寻并删除

实例6:搜索 /etc/passwd 找到 root 对应的行,执行后面花括号中的命令,每个命令之间用分号分割,并把bash替换为blueshell,在输出这行

        命令

1
nl /etc/passwd | sed -n '/bash/ {s/bash/blueshell/;p;q}'

        输出

1
2
[root@localhost ~]# nl /etc/passwd | sed -n '/bash/ {s/bash/blueshell/;p;q}'
1 root:x:0:0:root:/root:/bin/blueshell

        说明

        数据的搜寻并执行命令,最后的q是退出

实例7:查找 /etc/passwd 内 root 的行,并把 root 替换为 shell

        命令

1
sed 's/root/shell/g' /etc/passwd

        输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# sed 's/root/shell/g' /etc/passwd
shell:x:0:0:shell:/shell:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/shell:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin

        说明

        数据的搜寻并替换,s 就是替换的意思,g 为全局替换,否则只替换一次。

实例8:使用 ifconfig 查看ip地址,并提取出ip地址

        先使用 ifconfig 命令查询eth0网卡ip

1
2
3
4
5
6
7
8
9
[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:4D:9F:F7
inet addr:192.168.0.73 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe4d:9ff7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:41 errors:0 dropped:0 overruns:0 frame:0
TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4525 (4.4 KiB) TX bytes:5868 (5.7 KiB)

        命令

1
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

        输出

1
2
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.0.73

        说明

        数据的搜寻并替换,先观察原始信息,利用 ficonfig 查询 eth0 网卡 ip,再用 sed 命令将 ip 前面的部分删除(就是把前面的部分替换为空),接下来是删除后续的部分(把后续部分替换为空)

实例9:删除 /etc/passwd 第3行到末尾的数据,并把bash 替换为 blueshell

        命令

1
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/g'

        输出

1
2
3
4
[root@localhost ~]# nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/g'
1 root:x:0:0:root:/root:/bin/blueshell
2 bin:x:1:1:bin:/bin:/sbin/nologin

        说明

        多点编辑,-e 表示多点编辑,第一个编辑命令删除 /etc/passwd 第三行到末行的数据,第二条命令搜索 bash 替换为 blueshell

实例10:直接修改文件内容(危险动作)

        sed 可以直接修改文件的内容,不必使用管道命令或数据流重定向。不过,由于这个动作会直接修改到原始的文件,所以千万不要随便拿系统配置文件来测试!

        先用 cp 命令拷贝一份/etc/passwd 文件为 1.txt

1
[root@localhost ~]# cp /etc/passwd 1.txt

        删除所有非数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# sed -i 's/[^0-9]//g' 1.txt
[root@localhost ~]# cat 1.txt
00
11
22
34
47
50
60
70
812
110
12100
1450
9999
999997
192192
8181
998996
5959
8989
7474
997995

        说明

        sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果有一个100万行的文件,要在第100行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!就利用 sed ,通过 sed 直接修改、取代的功能,甚至不用使用 vim 去修订。